package com.lf.sp.service.impl;

import java.util.UUID;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.lf.sp.common.Const;
import com.lf.sp.common.ServerResponse;
import com.lf.sp.common.TokenCache;
import com.lf.sp.dao.UserMapper;
import com.lf.sp.pojo.User;
import com.lf.sp.service.IUserService;
import com.lf.sp.util.MD5Util;
/**
 * 
 * @author ha
 *
 */
@Service("iUserService")
public class UserServiceImpl implements IUserService{

	@Autowired
	private UserMapper userMapper;
	
	@Override
	public ServerResponse<User> login(String username, String password) {
		System.out.println();
		int resultCount = userMapper.checkUsername(username);
		if(resultCount==0){
			return ServerResponse.createByErrorMessage("用户名不存在");
		}
		//密码MD5登陆
		String md5Password = MD5Util.MD5EncodeUtf8(password);
		System.out.println(md5Password);
		User user = userMapper.checkLogin(username, md5Password);
		
		if(user==null){
			return ServerResponse.createByErrorMessage("密码错误");
		}
		
		user.setPassword(StringUtils.EMPTY);
		
		return ServerResponse.createBySuccess("登陆成功", user);
	}
	@Override
	public ServerResponse<String> register(User user){
		
		//校验用户名
		ServerResponse  validResponse = this.checkValid(user.getUsername(), Const.USERNAME);
		if(!validResponse.isSuccess()){
			return validResponse;
		}
		//校验邮箱
		validResponse = this.checkValid(user.getEmail(), Const.EMAIL);
		if(!validResponse.isSuccess()){
			return validResponse;
		}
		
		user.setRole(Const.Role.ROLE_CUSTOMER);
		//MD5加密
		user.setPassword(MD5Util.MD5EncodeUtf8(user.getPassword()));
		
		int resultCount = userMapper.insert(user);
		if(resultCount == 0){
			return ServerResponse.createByErrorMessage("注册失败");
		}
		return ServerResponse.createBySuccessMessage("注册成功");
	}
	
	@Override
	public ServerResponse<String> checkValid(String str,String type){
		if(StringUtils.isNotBlank(str)){
			//开始校验
			if(Const.USERNAME.equals(type)){
				int resultCount = userMapper.checkUsername(str);
				if(resultCount > 0){
					return ServerResponse.createByErrorMessage("用户名已存在");
				}
			}
			if(Const.EMAIL.equals(type)){
				int resultCount = userMapper.checkEmail(str);
				if(resultCount > 0){
					return ServerResponse.createByErrorMessage("邮箱已存在");
				}
			}
		}else{
			return ServerResponse.createByErrorMessage("参数错误");
		}
		return ServerResponse.createBySuccessMessage("校验成功");
	}
	@Override
	public ServerResponse<String> selectQuestion(String username){
		ServerResponse validResponse = this.checkValid(username, Const.USERNAME);
		if(validResponse.isSuccess()){
			return ServerResponse.createByErrorMessage("用户名不存在");
		}
		String question = userMapper.selectQuestionByUsername(username);
		if(StringUtils.isNotBlank(question)){
			return ServerResponse.createBySuccess(question);
		}
		return ServerResponse.createByErrorMessage("找回密码的问题是空的");
	}
	@Override
	public ServerResponse<String> checkAnswer(String username,String question, String answer){
		int resultCount = userMapper.checkAnswer(username, question, answer);
		if(resultCount > 0){
			//说明问题及问题的答案是这个用户的，并且是正确的
			String forgetToken = UUID.randomUUID().toString();
			TokenCache.setKey(TokenCache.TOKEN_PREFIX+username, forgetToken);
			return ServerResponse.createBySuccess(forgetToken);
		}
		return ServerResponse.createByErrorMessage("问题的答案不正确");
	}
	
	@Override
	public ServerResponse<String> forgetRestPassword(String username,String passwordNew,String forgetToken){
		if(StringUtils.isBlank(forgetToken)){
			return ServerResponse.createByErrorMessage("参数错误，token需要传递");
		}
		ServerResponse validResponse = this.checkValid(username, Const.USERNAME);
		if(validResponse.isSuccess()){
			return ServerResponse.createByErrorMessage("用户不存在");
		}
		String token = TokenCache.getKey(TokenCache.TOKEN_PREFIX+username);
		if(StringUtils.isBlank(token)){
			return ServerResponse.createByErrorMessage("token无效或者过期");
		}
		if(StringUtils.equals(forgetToken, token)){
			String md5Password = MD5Util.MD5EncodeUtf8(passwordNew);
			int resultCount = userMapper.updatePasswordByUsername(username,md5Password);
			if(resultCount > 0){
				return ServerResponse.createBySuccessMessage("密码更新成功");						
			}
			return ServerResponse.createByErrorMessage("密码更新失败");			
		}else{
			return ServerResponse.createByErrorMessage("token错误，请重新获取");
		}
	}
	@Override
	public ServerResponse<String> resetPassword(String passwordOld,String passwordNew, User user){
		//防止横行越权，要校验一下这个用户的旧密码，一定要指定是这个用户的，因为我们会查询一个count(1),如果不指定id，那么结果就是true啦count>0
		int resultCount = userMapper.checkPassword(MD5Util.MD5EncodeUtf8(passwordOld), user.getId());
		if(resultCount == 0){
			return ServerResponse.createByErrorMessage("旧密码错误");
		}
		user.setPassword(MD5Util.MD5EncodeUtf8(passwordNew));
		int updateCount = userMapper.updateByPrimaryKeySelective(user);
		if(updateCount > 0){
			return ServerResponse.createBySuccessMessage("密码更新成功");
		}
		return ServerResponse.createByErrorMessage("密码更新失败");
	}
	@Override
	public ServerResponse<User> updateInformation(User user){
		//username是不能被更新的
		//Email也要进行一个校验，检验新的email是不是已经存在，并且存在的Email如果相同的话，不能是我们这个当前用户的
		int resultCount = userMapper.checkEmailByUserId(user.getEmail(), user.getId());
		if(resultCount > 0){
			return ServerResponse.createByErrorMessage("邮箱已被占用请更换");
		}
		User updateUser = new User();
		updateUser.setId(user.getId());
		updateUser.setEmail(user.getEmail());
		updateUser.setPhone(user.getPhone());
		updateUser.setQuestion(user.getQuestion());
		updateUser.setAnswer(user.getAnswer());
		
		int updateCount = userMapper.updateByPrimaryKeySelective(updateUser);
		if(updateCount > 0){
			return ServerResponse.createBySuccess("更新成功",updateUser);
		}
		return ServerResponse.createByErrorMessage("更新失败");
	}
	@Override
	public ServerResponse<User> getInformation(Integer userId){
		User user = userMapper.selectByPrimaryKey(userId);
		if(user == null){
			return ServerResponse.createByErrorMessage("找不到当前用户");
		}
		user.setPassword(StringUtils.EMPTY);
		return ServerResponse.createBySuccess(user);
	}
	
	
	//backend
	/**
	 * 校验是否是管理员
	 * @param user
	 * @return
	 */
	@Override
	public ServerResponse checkAdminRole(User user){
		if(user != null && user.getRole().intValue() == Const.Role.ROLE_ADMIN){
			return ServerResponse.createBySuccess();
		}
		return ServerResponse.createByError();
	}
}
